package com.springstudy.shiro.shiro.filters;

import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.web.servlet.AdviceFilter;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * AdviceFilter 提供了 AOP 的功能
 * preHandle：进行请求的预处理，然后根据返回值决定是否继续处理（true：继续过滤器链）；可以通过它实现权限控制；
 * postHandle：执行完拦截器链之后正常返回后执行；
 * afterCompletion：不管最后有没有异常，afterCompletion 都会执行，完成如清理资源功能。
 *
 * @author chenrongrong
 * @since 2020/3/11 14:47
 */
@Slf4j
public class MyAdviceFilter extends AdviceFilter {

    /**
     * 过滤前预处理，return true后执行过滤后处理
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    @Override
    protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
        log.info(getClass().getSimpleName()+"过滤前预处理");
        return true;
    }

    /**
     * 过滤后处理
     * @param request
     * @param response
     * @throws Exception
     */
    @Override
    protected void postHandle(ServletRequest request, ServletResponse response) throws Exception {
        log.info(getClass().getSimpleName()+"过滤后处理");
    }

    /**
     * 不论是否通过过滤，最终处理
     * @param request
     * @param response
     * @param exception
     * @throws Exception
     */
    @Override
    public void afterCompletion(ServletRequest request, ServletResponse response, Exception exception) throws Exception {
        log.info(getClass().getSimpleName()+"不论是否通过过滤，最终处理");
    }
}
